Prevendo preços de carros com estatística

Seminário de modelos lineares

Davi, Diogo, João, Thiago e Eduardo Garcez

2025-01-07

Introdução

O dataset foi escolhido pela plataforma kaggle e trata de observações sobre o mercado automotivo online da Georgia 🇬🇪 no ano de 2024.

País localizado no cáucaso com cerca de 3,7 milhões de habitantes.

Conforme o schema apresentado a seguir o dataset apresenta diversos detalhes sobre as vendas, condições do carro e outros detalhes mais específicos.

Para esse trabalho, com o intuito de enfatizar os processos e análises que foram aprendidos na disciplina, tomamos liberdade de manipular o banco fornecido no site e descosiderar variáveis não utilizadas no modelo.


Abaixo também apresentamos uma tabela com as variáveis que escolhemos enfatizar e serão tratadas no modelo linear simulado.

Explorando o banco de dados

Nos moldes que foram aplicados temos 54112 registros a serem analisados.

Estatísticas gerais

Quantitativas

Visão geral de variáveis quantitativas;

price car_run_km prod_year engine_volume cylinders airbags
min 1020.0 1006.0 1911.00 1.00 1.00 0.00
max 8388607.0 1599998.0 2024.00 20000.00 12.00 12.00
median 7500.0 139200.0 2015.00 2000.00 4.00 9.00
mean 11210.5 149775.2 2013.50 2349.74 4.64 8.43
var 1502001894.7 9915531471.5 43.96 1089134.11 1.95 11.57

Categorias

Principais categorias de carros;

category count mean_price
Sedan 22048 9921.851
Jeep 15961 15821.028
Hatchback 7869 5655.509
Coupe 1702 13819.976
Minivan 1448 8790.843
Goods wagon 1196 6283.490

Montadoras

Montadoras com mais registros;

man_name count mean_price
Toyota 9042 11255.517
Mercedes-Benz 6598 15656.034
BMW 4709 15227.045
Ford 4504 7525.568
Hyundai 3005 9070.884
Honda 2834 6313.229
Nissan 2607 5574.705
Volkswagen 2531 7754.279
Subaru 2018 8295.811
Lexus 1810 20302.830

Representações gráficas


Preço

Ano de Fabricação

Características específicas

Equação do modelo linear

A equação do modelo linear é dada por:

\[ \text{price} = \beta_0 + \beta_1 \cdot \text{car_run_km} + \beta_2 \cdot \text{prod_year} + \beta_3 \cdot \text{engine_volume} + \beta_4 \cdot \text{cylinders} + \beta_5 \cdot \text{airbags} + \beta_6 \cdot \text{abs_break} + \beta_7 \cdot \text{esd} + \beta_8 \cdot \text{el_windows} + \beta_9 \cdot \text{conditioner} + \beta_10 \cdot \text{leather} + \beta_11 \cdot \text{nav_system} \]

#> 
#> Call:
#> lm(formula = price ~ car_run_km + prod_year + engine_volume + 
#>     cylinders + airbags + abs_break + esd + el_windows + conditioner + 
#>     leather + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#>  -44074   -5005   -1857    1831 8376743 
#> 
#> Coefficients:
#>                   Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)     -1.284e+06  6.463e+04 -19.862   <2e-16 ***
#> car_run_km      -2.199e-02  1.861e-03 -11.813   <2e-16 ***
#> prod_year        6.386e+02  3.210e+01  19.896   <2e-16 ***
#> engine_volume    2.484e+00  2.242e-01  11.079   <2e-16 ***
#> cylinders        1.681e+03  1.683e+02   9.984   <2e-16 ***
#> airbags         -4.221e+02  5.515e+01  -7.652    2e-14 ***
#> abs_breakTRUE    1.596e+03  8.257e+02   1.933   0.0532 .  
#> esdTRUE          8.556e+01  7.203e+02   0.119   0.9054    
#> el_windowsTRUE   1.479e+03  1.042e+03   1.420   0.1557    
#> conditionerTRUE -1.146e+03  9.856e+02  -1.163   0.2448    
#> leatherTRUE      1.116e+04  3.815e+04   0.293   0.7699    
#> nav_systemTRUE   1.321e+03  5.371e+02   2.459   0.0139 *  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 38150 on 54100 degrees of freedom
#> Multiple R-squared:  0.03124,    Adjusted R-squared:  0.03104 
#> F-statistic: 158.6 on 11 and 54100 DF,  p-value: < 2.2e-16

Apenas algumas variáveis apresentaram significância no modelo. Assim, o próximo modelo será construído excluindo as variáveis com p-valor maior que 0,05

#> 
#> Call:
#> lm(formula = price ~ car_run_km + prod_year + engine_volume + 
#>     cylinders + airbags + abs_break + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#>  -44011   -5008   -1852    1830 8376710 
#> 
#> Coefficients:
#>                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)    -1.275e+06  6.395e+04 -19.940  < 2e-16 ***
#> car_run_km     -2.198e-02  1.860e-03 -11.815  < 2e-16 ***
#> prod_year       6.344e+02  3.177e+01  19.970  < 2e-16 ***
#> engine_volume   2.478e+00  2.237e-01  11.076  < 2e-16 ***
#> cylinders       1.682e+03  1.682e+02  10.001  < 2e-16 ***
#> airbags        -4.231e+02  5.482e+01  -7.717 1.21e-14 ***
#> abs_breakTRUE   1.905e+03  5.250e+02   3.628 0.000286 ***
#> nav_systemTRUE  1.389e+03  4.894e+02   2.837 0.004551 ** 
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 38150 on 54104 degrees of freedom
#> Multiple R-squared:  0.0312, Adjusted R-squared:  0.03107 
#> F-statistic: 248.9 on 7 and 54104 DF,  p-value: < 2.2e-16

Interpretação dos Coeficientes

\[ \text{price} = \beta_0 + \beta_1 \cdot \text{car_run_km} + \beta_2 \cdot \text{prod_year} + \beta_3 \cdot \text{engine_volume} + \beta_4 \cdot \text{cylinders} + \beta_5 \cdot \text{airbags} + \beta_6 \cdot \text{abs_break} + \beta_7 \cdot \text{nav_system} \]

  • \(\beta_0\) (intercept) nos indica que o valor esperado quando do veículo quando todas variáveis independentes são iguais a zero. Logo o beta_0 não tem interpretação prática pois o ano de produção não pode ser 0.

  • car_run_km (Quilometragem): Para cada quilômetro adicional rodado, o preço do veículo diminuí em média -0.02 unidades monetárias, mantendo todas as outras variáveis constantes.

  • prod_year (Ano de produção): Para cada ano adicional de produção, o preço do veículo aumenta em média 634.40 unidades monetárias, mantendo todas as outras variáveis constantes.

  • engine_volume (volume do motor) : Para cada unidade adicional no volume do motor, o preço do veículo aumenta em média 2.47 unidades monetárias, mantendo todas as outras variáveis constantes.

  • cylinders (cilindro adicional): Para cada cilindro adicional, o preço do veículo aumenta em média 1682.0 unidades monetárias, mantendo todas as outras variáveis constantes.

  • airbags Para cada airbags, o preço do veículo diminui em média -423.1 unidades monetárias, mantendo todas as outras variáveis constantes.

  • abs_break (Sistema de freio) Para presença de ABS, o aumento esperado na variável resposta é 1905 unidades monetárias, mantendo todas as outras variáveis constantes.

  • nav_system (Sistema de navegação) Para presença de Sistema de navegação, o aumento esperado na variável resposta é 1389 unidades monetárias, mantendo todas as outras variáveis constantes.

Interpretação do teste F

F-statistic: 248.9
p-valor: < 2.2e-16
Adjusted R-squared: 0.03107

  • F-statistic: O valor de 248.9 indica que a variabilidade explicada pelo modelo é significativamente maior do que a variabilidade não explicada. Em outras palavras, o modelo como um todo é significativo.

  • p-valor: O p-valor é extremamente pequeno (< 2.2e-16), o que significa que a probabilidade de observar um valor de F tão extremo, ou mais extremo, sob a hipótese nula é praticamente zero.

  • Adjusted R-squared: Apenas cerca de 3.1% da variabilidade dos dados observados é explicada pelo modelo ajustado.

  • Conclusão: Apesar do modelo ser estatisticamente significativo como um todo, com um p-valor extremamente pequeno (< 2.2e-16), sua capacidade explicativa é muito limitada, conforme evidenciado pelo \(R^2\) ajustado de apenas 3.1%. Isso indica que o modelo consegue explicar apenas uma pequena fração da variabilidade nos preços dos carros.

    Portanto, prosseguiremos com a análise detalhada dos resíduos, buscando identificar possíveis outliers ou padrões que possam estar influenciando negativamente o desempenho do modelo e comprometendo sua capacidade preditiva.

Voltando a equação…

\[ \text{price} = \beta_0 + \beta_1 \cdot \text{car_run_km} + \beta_2 \cdot \text{prod_year} + \beta_3 \cdot \text{engine_volume} + \beta_4 \cdot \text{cylinders} + \beta_5 \cdot \text{airbags} + \beta_6 \cdot \text{abs_break} + \beta_7 \cdot \text{nav_system} \] Substituindo os valores dos coeficientes estimados, temos:

\[ \begin{align*} \text{price} = &\ -1,275,000 - 0.02198 \cdot \text{car_run_km} + 634.4 \cdot \text{prod_year} + 2.478 \cdot \text{engine_volume} \\ &+ 1,682 \cdot \text{cylinders} - 423.1 \cdot \text{airbags} + 1,905 \cdot \text{abs_break} + 1,389 \cdot \text{nav_system} \end{align*} \]

Multicolinearidade

Outliers podem distorcer as relações entre variáveis, afetando correlações e métricas como o VIF, o que pode dar uma falsa impressão da gravidade da multicolinearidade. Para minimizar esses efeitos, analisamos a multicolinearidade tanto na escala original quanto na logarítmica, já que a transformação logarítmica ajuda a estabilizar a variância e reduzir a influência de valores extremos.

Escala original

VIF
car_run_km 1.276091
prod_year 1.649412
engine_volume 2.026582
cylinders 2.046492
airbags 1.292736
abs_break 1.936921
nav_system 2.093494

Com base nas correlações moderadas entre algumas variáveis explicativas e os baixos valores de VIF (entre 1 e 2), evidenciando que a multicolinearidade não é um problema relevante neste modelo, pois, embora algumas variáveis apresentem covariância moderadas entre si, elas não estão redundantes a ponto de inflacionar a variância dos coeficientes.

Com escala log

Variável VIF
nav_system nav_system 2.077215
car_run_km car_run_km 1.196893
prod_year prod_year 1.557294
cylinders cylinders 2.197210
airbags airbags 1.237580
abs_break abs_break 1.913135
engine_volume engine_volume 2.158339

Mesmo ao aplicar a transformação logarítmica, os valores do VIF permaneceram baixos, indicando que a multicolinearidade não é um problema relevante neste modelo.

Análise de resíduos

Transformação em log escala

#> 
#> Call:
#> lm(formula = log(price) ~ car_run_km + prod_year + cylinders + 
#>     airbags + abs_break + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -2.7563 -0.3448 -0.0139  0.3284  6.9267 
#> 
#> Coefficients:
#>                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)    -9.485e+01  1.024e+00  -92.64   <2e-16 ***
#> car_run_km     -1.055e-06  2.972e-08  -35.49   <2e-16 ***
#> prod_year       5.114e-02  5.086e-04  100.56   <2e-16 ***
#> cylinders       1.745e-01  1.931e-03   90.35   <2e-16 ***
#> airbags        -1.793e-02  8.777e-04  -20.43   <2e-16 ***
#> abs_breakTRUE   1.753e-01  8.377e-03   20.93   <2e-16 ***
#> nav_systemTRUE  3.068e-01  7.831e-03   39.17   <2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.611 on 54105 degrees of freedom
#> Multiple R-squared:  0.4169, Adjusted R-squared:  0.4169 
#> F-statistic:  6448 on 6 and 54105 DF,  p-value: < 2.2e-16